import { forEachValue } from '../utils'
import Module from './module'
export default class ModuleCollection {
    constructor(rootModule) {
        this.root = null;
        this.register(rootModule, []) // root => a b  a=>c
    }
    // 根据path数组，递归构建父子关系模块
    register(rawModule, path) {
        // 每个模块的也用一个类来实现，因为
        const newModule = new Module(rawModule);
        if (path.length == 0) { // 是根模块
            this.root = newModule
        } else {
            // parent最后返回的是rawModule的父亲模块
            // 因为path会是一个装着 子模块名称 的数组，删除最后一个，最后返回的就是最后一个的父模块
            const parent = path.slice(0, -1).reduce((module, current) => {
                // 获取名称为 current的 子模块
                return module.getChild(current)
            }, this.root);
            // 向其父模块中添加自己
            parent.addChild(path[path.length - 1], newModule)
        }
        // 循环递归用户传入的 子模块 
        if (rawModule.modules) {
            forEachValue(rawModule.modules, (rawChildModule, key) => {
                this.register(rawChildModule, path.concat(key))
            })
        }
        return newModule
    }
    // 判断是否开启命名空间， 构建名称 a/b
    getNamespaced(path) {
        let module = this.root // [a,c] a/c
        return path.reduce((namespaceStr, key) => {
            module = module.getChild(key); // 子模块
            return namespaceStr + (module.namespaced ? key + '/' : '')
        }, '')
    }
}